import React, { useState, useRef, useEffect } from 'react'; import { Calendar, List, Image as ImageIcon, FileSpreadsheet, Printer, PlusCircle, Users, BookOpen, CheckCircle2, Trash2, Camera, MapPin } from 'lucide-react'; export default function AgendaMengajar() { const [activeTab, setActiveTab] = useState('form'); const [agendas, setAgendas] = useState([]); const [notification, setNotification] = useState(null); // State untuk Form const [formData, setFormData] = useState({ nama_guru: '', nama_mapel: '', nama_kelas: '', // Field baru tanggal: new Date().toISOString().split('T')[0], jam_ke: '', // Menggantikan pertemuan_ke materi: '', jml_hadir: '', jml_absen: '', ket_sakit: '0', ket_izin: '0', ket_alpa: '0', nama_siswa_absen: '', // Field baru foto_bukti: null }); const fileInputRef = useRef(null); // Notifikasi Timer useEffect(() => { if (notification) { const timer = setTimeout(() => setNotification(null), 3000); return () => clearTimeout(timer); } }, [notification]); const handleInputChange = (e) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); // Auto-kalkulasi absen jika sakit/izin/alpa diubah if (['ket_sakit', 'ket_izin', 'ket_alpa'].includes(name)) { setTimeout(() => { setFormData(current => { const totalAbsen = (parseInt(current.ket_sakit) || 0) + (parseInt(current.ket_izin) || 0) + (parseInt(current.ket_alpa) || 0); return { ...current, jml_absen: totalAbsen.toString() }; }); }, 0); } }; const handleFileChange = (e) => { const file = e.target.files[0]; if (file) { // Validasi ukuran file (maks 5MB untuk mengakomodasi kamera HP) if (file.size > 5 * 1024 * 1024) { showNotification('Ukuran file terlalu besar! Maksimal 5MB.', 'error'); return; } const reader = new FileReader(); reader.onloadend = () => { setFormData(prev => ({ ...prev, foto_bukti: reader.result })); }; reader.readAsDataURL(file); } }; const showNotification = (message, type = 'success') => { setNotification({ message, type }); }; const handleSubmit = (e) => { e.preventDefault(); // Validasi sederhana if (!formData.nama_guru || !formData.nama_mapel || !formData.nama_kelas || !formData.tanggal || !formData.jam_ke || !formData.materi || !formData.jml_hadir) { showNotification('Mohon lengkapi field yang wajib diisi!', 'error'); return; } const newAgenda = { id: Date.now(), ...formData, timestamp: new Date().toLocaleString('id-ID') }; setAgendas(prev => [newAgenda, ...prev]); showNotification('Agenda berhasil disimpan!'); // Reset Form setFormData(prev => ({ ...prev, // Menyimpan nama_guru, nama_mapel, dan nama_kelas tanggal: new Date().toISOString().split('T')[0], jam_ke: '', // Dikosongkan karena format bisa "1-2" materi: '', jml_hadir: '', jml_absen: '0', ket_sakit: '0', ket_izin: '0', ket_alpa: '0', nama_siswa_absen: '', foto_bukti: null })); if (fileInputRef.current) fileInputRef.current.value = ''; // Pindah ke tab riwayat setActiveTab('riwayat'); }; const handleDelete = (id) => { setAgendas(prev => prev.filter(agenda => agenda.id !== id)); showNotification('Agenda dihapus.'); }; const exportToCSV = () => { if (agendas.length === 0) { showNotification('Tidak ada data untuk diekspor', 'error'); return; } const headers = ['Nama Guru', 'Mata Pelajaran', 'Kelas', 'Tanggal', 'Jam Ke', 'Materi', 'Hadir', 'Absen', 'Sakit', 'Izin', 'Alpa', 'Siswa Absen', 'Waktu Input']; const rows = agendas.map(a => [ `"${a.nama_guru}"`, `"${a.nama_mapel}"`, `"${a.nama_kelas}"`, a.tanggal, `"${a.jam_ke}"`, `"${a.materi.replace(/"/g, '""')}"`, a.jml_hadir, a.jml_absen, a.ket_sakit, a.ket_izin, a.ket_alpa, `"${(a.nama_siswa_absen || '').replace(/"/g, '""')}"`, a.timestamp ]); const csvContent = "data:text/csv;charset=utf-8," + [headers.join(','), ...rows.map(e => e.join(','))].join('\n'); const encodedUri = encodeURI(csvContent); const link = document.createElement("a"); link.setAttribute("href", encodedUri); link.setAttribute("download", `Agenda_Mengajar_${new Date().toISOString().split('T')[0]}.csv`); document.body.appendChild(link); link.click(); document.body.removeChild(link); }; const printDocument = () => { window.print(); }; return (
{/* Header - Disembunyikan saat print */}

Agenda Mengajar

Portal Guru
{/* Navigasi Tabs - Disembunyikan saat print */}
{/* Notifikasi Toast */} {notification && (

{notification.message}

)} {/* Konten Utama */}
{/* TAB FORM INPUT */} {activeTab === 'form' && (

Form Agenda Baru

Isi detail aktivitas belajar mengajar hari ini.

{/* Baris Input Guru, Mapel, Kelas (3 Kolom pada layar besar, 1 kolom di HP) */}
{/* Kolom Kiri */}
{/* Kolom Kanan */}

Statistik Kehadiran Siswa

{formData.foto_bukti ? (
Preview
) : (

Gambar Maks. 5MB

)}
)} {/* TAB RIWAYAT / DASHBOARD */} {activeTab === 'riwayat' && (
{/* Header Riwayat */}

Riwayat Agenda

Daftar aktivitas mengajar yang telah diinput.

{/* Header Khusus Print (Hanya muncul saat dicetak) */}

Laporan Agenda Mengajar Guru

Dicetak pada: {new Date().toLocaleDateString('id-ID')}

{/* Tabel Data (Diberi pembungkus overflow-x-auto agar bisa digeser horizontal di HP) */}
{agendas.length === 0 ? (

Belum ada agenda

Silakan input agenda mengajar Anda pada tab form.

) : ( {agendas.map((item) => ( ))}
Tanggal Guru & Mapel Kelas Jam Materi Hadir Absen & Ket Bukti Aksi
{new Date(item.tanggal).toLocaleDateString('id-ID', { weekday: 'short', day: 'numeric', month: 'short', year: 'numeric' })}
{item.nama_guru}
{item.nama_mapel}
{item.nama_kelas} {item.jam_ke} {item.materi} {item.jml_hadir} 0 ? 'bg-rose-100 text-rose-800' : 'bg-slate-100 text-slate-600'} py-1 px-2.5 rounded-md font-medium text-xs print:bg-transparent print:p-0`}> {item.jml_absen}
S:{item.ket_sakit} | I:{item.ket_izin} | A:{item.ket_alpa}
{item.nama_siswa_absen && (
{item.nama_siswa_absen}
)}
{item.foto_bukti ? (
Bukti
) : ( - )}
)}
)}
); }